package com.hejing.Map接口及其实现类的使用;

import org.junit.Test;

import java.util.*;

/**
 * ClassName: MapTeset
 * Package: com.hejing.Map接口及其实现类的使用
 * Description:
 *
 * @Author: HeJing
 * @Create: 2023-05-20 15:46
 * @Version: 1.0
 */
public class MapTest {

    /**
     * 测试HashMap : 能储存为null的key-value
     */
    @Test
    public void test01(){
        Map map = new HashMap();
        map.put(null, null);
        System.out.println(map);
    }

    /**
     * 测试Hashtable: 不能储存为null的key-value
     */
    @Test
    public void test02(){
        Map map = new Hashtable();
        // map.put(1, null);  // key 和 value都不能为 null
        map.put(1, "aa");
        System.out.println(map);
    }

    /**
     * 测试LinkedHashMap:
     *      是HashMap的子类；在HashMap使用的数据结构的基础上，增加了一对双向链表，用于记录添加的元素的先后顺序，进而在
     *      遍历元素时，就可以按照添加的元素的顺序进行显示。开发中，对于频繁的遍历操作，建议使用LinkedHashMap
     */
    @Test
    public void test03(){
        Map map = new LinkedHashMap();
        map.put("Tom", 10);
        map.put("Jerry", 20);
        map.put("Luccy", 30);
        System.out.println(map);
    }

    /**
     * 测试: Map的常用方法；
     */
    @Test
    public void test04(){
        Map map = new HashMap();

        // 增加 put:
        map.put("AA", 10);
        map.put(100, 20);
        map.put(true, 30);
        map.put('c', 40);
        map.put(new Person("luffy", 20), 15);

        System.out.println(map.size());
        System.out.println(map);
        System.out.println(map.keySet());
        System.out.println(map.values());
        System.out.println(map.entrySet());

        System.out.println("*************************");
        // 修改(覆盖) put
        Object oldObj = map.put(true, -30);  // 返回被替换的旧的value
        System.out.println("oldValue: " + oldObj);  // 30
        System.out.println(map);

        System.out.println("*************************");
        // 移除: remove
        map.remove(true);
        System.out.println(map.size());
        System.out.println(map);

        System.out.println("****************************");
        // 查询: get
        Object value1 = map.get(1);  // 没有此元素，返回null
        System.out.println(value1);

        Object value2 = map.get(new Person("luffy", 20));
        System.out.println(value2);
    }

    /**
     * map的遍历操作
     */
    @Test
    public void test05(){

        Map map = new HashMap();
        map.put("AA", 10);
        map.put(100, 20);
        map.put(true, 30);
        map.put('c', 40);
        map.put(new Person("luffy", 20), 15);

        // 遍历key集合
        Set set = map.keySet();
        // 迭代器遍历:
        Iterator iterator = set.iterator();
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        System.out.println("**************************");

        // 遍历value
        Collection coll = map.values();
        for(Object obj: coll) {
            System.out.println(obj);
        }

        System.out.println("**************************");
        // 遍历key-value对
        Set set02 = map.entrySet();
        for(Object obj: set02) {
            Map.Entry entry = (Map.Entry)obj;   // 强转
            System.out.println(entry.getClass());
            System.out.println(entry);
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());

        }

    }
}























